package co.edu.poli.ficb.agl.automatable.modelo;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * @author Diego Satoba
 * @author Ingrid Baquero 
 * @version 1.1, 03/29/11
 * @since 1.0
 *
 */
public class CadenaLista implements Cadena, Iterable<Simbolo> {
	
	/**
	 * @uml.property  name="secuencia"
	 * @uml.associationEnd  multiplicity="(0 -1)" elementType="co.edu.poli.ficb.agl.automatable.modelo.SimboloImpl"
	 */
	private List<Simbolo> secuencia;
	
	public CadenaLista() {
		this.secuencia = new ArrayList<Simbolo>();
	}
	
	public CadenaLista(List<Simbolo> secuencia) {
		this.secuencia = secuencia;		
	}
	
	public CadenaLista(String string) {
		this();
		for (char c : string.toCharArray()) {
			this.secuencia.add(new SimboloImpl(c));
		}
	}
	
	@Override
	public String toString() {
		StringBuffer sb = new StringBuffer();
		for (Simbolo s : this.secuencia) {
			sb.append(s.toString());
		}
		return sb.toString();
	}

	@Override
	public Cadena concatenar(Cadena cadena) {
		CadenaLista nuevaCadena = new CadenaLista();
		for (Simbolo simbolo :  this.secuencia)
			nuevaCadena.agregarSimbolo(simbolo);
		
		for (Simbolo simbolo : new Iterable<Simbolo>(){
			Cadena cadena;
			public Iterable<Simbolo> setCadena(Cadena cadena) {
				this.cadena = cadena;
				return this;
			}
			@Override
			public Iterator<Simbolo> iterator() {
				return cadena.iterator();
			}			
		}.setCadena(cadena)) {
			nuevaCadena.agregarSimbolo(simbolo);
		}
		return nuevaCadena;
	}

	@Override
	public Iterator<Simbolo> iterator() {
		return this.secuencia.iterator();
	}

	@Override
	public boolean agregarSimbolo(Simbolo simbolo) {
		return this.secuencia.add(simbolo);
	}

	@Override
	public int longitud() {
		return this.secuencia.size();
	}

	@Override
	public Cadena potencia(int n) {
		Cadena nuevaCadena = new CadenaLista();
		for (int i = 0; i < n; i++) 
			nuevaCadena = nuevaCadena.concatenar(this);
		return nuevaCadena;
	}
}
